package visao;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import modelo.Equipe;
import modelo.Gol;
import modelo.Jogo;
import controle.ControleGol;
import controle.ControleJogo;

@ManagedBean(name="jogoBean")
@SessionScoped
public class JogoBean {
	private Jogo jogo = new Jogo();
	private ControleJogo controle = new ControleJogo();
	private List<Jogo> jogos = new ArrayList<Jogo>();
	private Jogo jogoSelecionado = new Jogo();
	private Equipe equipe1;
	private Equipe equipe2;
	private List<Equipe> equipes1;
	private List<Equipe> equipes2;
	private long golEquipe1=0;
	private long golEquipe2=0;
	private ControleGol controleGol = new ControleGol();
	private List<Long> golsEquipe2 ;
	private List<Long> golsEquipe1 ;

	

	public long getGolEquipe1() {
		return golEquipe1;
	}

	public void setGolEquipe1(int golEquipe1) {
		this.golEquipe1 = golEquipe1;
	}

	public long getGolEquipe2() {
		return golEquipe2;
	}

	public void setGolEquipe2(int golEquipe2) {
		this.golEquipe2 = golEquipe2;
	}

	public List<Equipe> getEquipes() {
		equipes1 =  controle.listarEquipes();
		System.out.println("qtdade equipes " + equipes1.size());
		return equipes1;
	}
	
	public List<Equipe> getEquipes2() {
		equipes2 =  controle.listarEquipes();
		System.out.println("qtdade equipes " + equipes2.size());
		return equipes2;
	}
	
	public void atualizarEquipes2() {
		if(equipe1 !=null && !equipe1.equals("")){
			equipes2 =  controle.listarEquipes();
			equipes2.remove(equipe1);
		}
		System.out.println("atualizou!");
	}
	public void atualizarEquipes1() {
		//<p:ajax listener="#{jogoBean.atualizarEquipes2}" process="@this" update="equipe2_id,:formulario:TextoEquipe1" />
		if(equipe2 !=null && !equipe2.equals("")){
			equipes1 =  controle.listarEquipes();
			equipes1.remove(equipe2);
		}
		System.out.println("atualizou!");
	}


	public Jogo getJogo() {
		return jogo;
	}
	public void setJogo(Jogo jogo) {
		this.jogo = jogo;
	}
	public ControleJogo getControle() {
		return controle;
	}
	public void setControle(ControleJogo controle) {
		this.controle = controle;
	}
	public List<Jogo> getJogos() {
		return jogos;
	}
	public void setJogos(List<Jogo> jogos) {
		this.jogos = jogos;
	}
	public Jogo getJogoSelecionado() {
		return jogoSelecionado;
	}
	public void setJogoSelecionado(Jogo jogoSelecionado) {
		this.jogoSelecionado = jogoSelecionado;
	}
	
	
	public Equipe getEquipe1() {
		return equipe1;
	}
	public void setEquipe1(Equipe equipe1) {
		this.equipe1 = equipe1;
	}
	public Equipe getEquipe2() {
		return equipe2;
	}
	public void setEquipe2(Equipe equipe2) {
		this.equipe2 = equipe2;
	}
	/* CRUD */
	public String novo() {
		jogo = new Jogo();
		return "/restrito/cadastroJogo";
	}

	public String voltar() {
		jogo = new Jogo();
		return "/restrito/indexJogo";
	}

	public String Salvar() {
		FacesContext context = FacesContext.getCurrentInstance();
	
		List<Gol> gols = new ArrayList<Gol>();
	
		
		
		try {
			
			jogo.setEquipe1(equipe1);
			jogo.setEquipe2(equipe2);
			jogo.setPlacarEquipe1(String.valueOf(golEquipe1));
			jogo.setPlacarEquipe2(String.valueOf(golEquipe2));
			controle.salvar(jogo);
			for (int i = 0; i<golEquipe1; i++){
				Gol gol = new Gol();
				Random gerador =  new Random();
				int j= gerador.nextInt(23);
			gol.setJogador(jogo.getEquipe1().getJogadores().get(j));
			gol.setJogo(jogo);
			controleGol.salvar(gol);
			gols.add(gol);
				
			}
			
			for (int i = 0; i<golEquipe2; i++){
				Gol gol = new Gol();
				Random gerador =  new Random();
				int j= gerador.nextInt(23);
			gol.setJogador(jogo.getEquipe2().getJogadores().get(j));
			gol.setJogo(jogo);
			controleGol.salvar(gol);
			gols.add(gol);
			}
			jogo.setGols(gols);
			controle.salvar(jogo);
			context.addMessage(null, new FacesMessage(
					FacesMessage.SEVERITY_INFO,
					"Jogo Cadastrado com Sucesso!", ""));
			jogo = new Jogo();
		} catch (Exception e) {
			e.printStackTrace();
			context.addMessage(null, new FacesMessage(
					FacesMessage.SEVERITY_ERROR, e.getMessage(), ""));
		}
		return "/restrito/indexJogo";
	}

	public void setGolEquipe1(long golEquipe1) {
		this.golEquipe1 = golEquipe1;
	}

	public void setGolEquipe2(long golEquipe2) {
		this.golEquipe2 = golEquipe2;
	}

	public String excluir() {
		FacesContext faces = FacesContext.getCurrentInstance();
		ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
		HttpSession session = (HttpSession) externalContext.getSession(true);
		LoginBean loginBean = (LoginBean) session.getAttribute("loginBean");
		if (loginBean == null || !loginBean.isLogado()) {
			faces.addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR,"Voce deve estar logado para acessar essa pagina!",""));
			return "/publico/login";
		}
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			controle.excluir(jogoSelecionado);
		} catch (Exception e) {
			e.printStackTrace();
			context.addMessage(null, new FacesMessage(
					FacesMessage.SEVERITY_ERROR, e.getMessage(), ""));
			return "";
		}
		return "/publico/listarJogo";
	}

	public String alterar() {
		FacesContext faces = FacesContext.getCurrentInstance();
		ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
		HttpSession session = (HttpSession) externalContext.getSession(true);
		LoginBean loginBean = (LoginBean) session.getAttribute("loginBean");
		if (loginBean == null || !loginBean.isLogado()) {
			faces.addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR,"Voce deve estar logado para acessar essa pagina!",""));
			return "/publico/login";
		}
		this.jogo = this.jogoSelecionado;
		return "/restrito/cadastroJogo";
	}

	/* FIM CRUD */
	
	/* LISTAR */
	public String buscarPorId() {
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			jogos = new ArrayList<Jogo>();
			jogo = controle.buscarPorId(jogo.getId());
			jogos.add(jogo);
			golEquipe1 = 0;
			golEquipe2 = 0;
			golsEquipe1 = new ArrayList<Long>();
			golsEquipe2 = new ArrayList<Long>();
			for (int i = 0; i< 23; i++){
				try{
					
				golEquipe1+= controleGol.buscarPorJogadorEJogo(jogo.getEquipe1().getJogadores().get(i), jogo);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			for (int i = 0; i<23; i++){
				try{
				golEquipe2+= controleGol.buscarPorJogadorEJogo(jogo.getEquipe2().getJogadores().get(i), jogo);
			} catch (Exception e) {
				e.printStackTrace();
			}
			}
			golsEquipe1.add(golEquipe2);
			golsEquipe2.add(golEquipe2);
		} catch (Exception e) {
			e.printStackTrace();
			context.addMessage(null, new FacesMessage(
					FacesMessage.SEVERITY_ERROR, e.getMessage(), ""));
			return "";
		}
		return "/publico/listarJogo";
	}
	
	public String buscarPorEquipe() {
		FacesContext context = FacesContext.getCurrentInstance();
		golsEquipe1 = new ArrayList<Long>();
		golsEquipe2 = new ArrayList<Long>();
		jogos = new ArrayList<Jogo>();
		
	
		try {
			jogos = controle.buscarPorEquipe(equipe1);
			golsEquipe1 = new ArrayList<Long>();
			golsEquipe2 = new ArrayList<Long>();
			for(int j = 0; j<  jogos.size(); j++){
				long golEq1 = 0;
				long golEq2= 0;
				for (int i = 0; i < 23; i++){
					try{
						
						golEq1+= controleGol.buscarPorJogadorEJogo( jogos.get(j).getEquipe1().getJogadores().get(i), jogos.get(j));
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
				for (int i = 0; i<23; i++){
					try{
						golEq2 += controleGol.buscarPorJogadorEJogo( jogos.get(j).getEquipe2().getJogadores().get(i), jogos.get(j));
				} catch (Exception e) {
					e.printStackTrace();
				}
				}
				golsEquipe1.add(golEq1);
				golsEquipe2.add(golEq2);
				
				
			}
			
		
			
		} catch (Exception e) {
			e.printStackTrace();
			context.addMessage(null, new FacesMessage(
					FacesMessage.SEVERITY_ERROR, e.getMessage(), ""));
			return "";
		}
		return "/publico/listarJogo";
	}
	
	public String buscarPorData() {
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			
			jogos = controle.buscarPorData(jogo.getData());
		} catch (Exception e) {
			e.printStackTrace();
			context.addMessage(null, new FacesMessage(
					FacesMessage.SEVERITY_ERROR, e.getMessage(), ""));
			return "";
		}
		return "/publico/listarJogo";
	}
	
	public String buscarPorEstadio() {
		jogos = new ArrayList<Jogo>();
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			jogos = controle.buscarPorEstadio(jogo.getEstadio());
			golsEquipe1 = new ArrayList<Long>();
			golsEquipe2 = new ArrayList<Long>();
			for(int j = 0; j<  jogos.size(); j++){
				long golEq1 = 0;
				long golEq2= 0;
				for (int i = 0; i < 23; i++){
					try{
						
						golEq1+= controleGol.buscarPorJogadorEJogo( jogos.get(j).getEquipe1().getJogadores().get(i), jogos.get(j));
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
				for (int i = 0; i<23; i++){
					try{
						golEq2 += controleGol.buscarPorJogadorEJogo( jogos.get(j).getEquipe2().getJogadores().get(i), jogos.get(j));
				} catch (Exception e) {
					e.printStackTrace();
				}
				}
				golsEquipe1.add(golEq1);
				golsEquipe2.add(golEq2);
				
				
			}
		} catch (Exception e) {
			e.printStackTrace();
			context.addMessage(null, new FacesMessage(
					FacesMessage.SEVERITY_ERROR, e.getMessage(), ""));
			return "";
		}
		return "/publico/listarJogo";
	}
	
	
	public String buscarTodos() {
		jogos = new ArrayList<Jogo>();
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			jogos = controle.listarTodos();
			golsEquipe1 = new ArrayList<Long>();
			golsEquipe2 = new ArrayList<Long>();
			for(int j = 0; j<  jogos.size(); j++){
				long golEq1 = 0;
				long golEq2= 0;
				for (int i = 0; i < 23; i++){
					try{
						
						golEq1+= controleGol.buscarPorJogadorEJogo( jogos.get(j).getEquipe1().getJogadores().get(i), jogos.get(j));
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
				for (int i = 0; i<23; i++){
					try{
						golEq2 += controleGol.buscarPorJogadorEJogo( jogos.get(j).getEquipe2().getJogadores().get(i), jogos.get(j));
				} catch (Exception e) {
					e.printStackTrace();
				}
				}
				golsEquipe1.add(golEq1);
				golsEquipe2.add(golEq2);
				
				
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
			context.addMessage(null, new FacesMessage(
					FacesMessage.SEVERITY_ERROR, e.getMessage(), ""));
			return "";
		}
		return "/publico/listarJogo";
	}

	public List<Long> getGolsEquipe2() {
		return golsEquipe2;
	}

	public List<Long> getGolsEquipe1() {
		return golsEquipe1;
	}
	
	

	/* FIM LISTAR */
}
